package com.locus.locus.client.widgets;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.locus.locus.client.ServidorAsync;
import com.locus.locus.client.dados.ConfiguracaoBoxWrapper;
import com.locus.locus.client.dados.EstabelecimentoWrapper;

public class WidgetConfiguracaoBox extends Composite {

	public class ExlcluitHandler implements ClickHandler {
		private final ConfiguracaoBoxWrapper box;

		public ExlcluitHandler(ConfiguracaoBoxWrapper box) {
			this.box = box;
		}

		@Override
		public void onClick(ClickEvent event) {
			servidor.excluirConfiguracoesBox(this.box, callbackExcluirBox);
		}
	}

	private static WidgetBoxUiBinder uiBinder = GWT
			.create(WidgetBoxUiBinder.class);

	interface WidgetBoxUiBinder extends UiBinder<Widget, WidgetConfiguracaoBox> {	}
	
	private final AsyncCallback<List<EstabelecimentoWrapper>> callbackEstabelecimentos = new  AsyncCallback<List<EstabelecimentoWrapper>>() {
		@Override
		public void onSuccess(List<EstabelecimentoWrapper> estabelecimentos) {
			for(EstabelecimentoWrapper estabelecimento:estabelecimentos){
				listaEstabelecimentos.addItem(estabelecimento.getNome(), estabelecimento.getChave());
			}
			
			btAdicionarEstabelecimento.setEnabled(true);
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em buscar lista de estabelecimentos");
		}
	};
	
	public final AsyncCallback<Void> callbackExcluirBox = new AsyncCallback<Void>() {
		@Override
		public void onSuccess(Void result) {
			servidor.buscarConfiguracoesBoxes(callbackBoxes);
			Window.alert("box excluido");
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em deletar box");
		}
	};

	private final AsyncCallback<List<ConfiguracaoBoxWrapper>> callbackBoxes = new AsyncCallback<List<ConfiguracaoBoxWrapper>>() {
		@Override
		public void onSuccess(List<ConfiguracaoBoxWrapper> boxes) {
			ConfiguracaoBoxWrapper box;
			Button btExcluir;
			
			btAdicionar.setEnabled(true);
			
			listaBoxes.removeAllRows();
			listaBoxes.setText(0, 0, "nome");
			
			for(int i = 0; i < boxes.size(); i++){
				box = boxes.get(i);
				btExcluir = new Button("Deletar");
				btExcluir.addClickHandler(new ExlcluitHandler(box));
				
				listaBoxes.setText(i + 1, 0, box.getNomeBox());
				listaBoxes.setWidget(i + 1, 1, btExcluir);
			}
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em buscar boxes");
		}
	};
	
	private AsyncCallback<Void> callbackInserirBox = new AsyncCallback<Void>() {
		
		@Override
		public void onSuccess(Void result) {
			tabelaEstabelecimentosSelecionados.removeAllRows();
			tbNomeBox.setText("");
			servidor.buscarConfiguracoesBoxes(callbackBoxes);
		}
		
		@Override
		public void onFailure(Throwable caught) {
			Window.alert("falha em inserir box");
		}
	};

	@UiField
	TextBox tbNomeBox;
	@UiField
	Button btAdicionar;
	@UiField
	ListBox listaEstabelecimentos;
	@UiField
	Button btAdicionarEstabelecimento;
	@UiField
	FlexTable listaBoxes;
	@UiField
	FlexTable tabelaEstabelecimentosSelecionados;

	private final ServidorAsync servidor;
	private final List<String> fornecedoresSelecionados;

	public WidgetConfiguracaoBox(ServidorAsync servidor) {
		initWidget(uiBinder.createAndBindUi(this));
		
		this.servidor = servidor;
		
		this.btAdicionarEstabelecimento.setEnabled(false);
		this.btAdicionar.setEnabled(false);
		this.servidor.buscarEstabelecimentos(this.callbackEstabelecimentos);
		this.servidor.buscarConfiguracoesBoxes(this.callbackBoxes);
		
		this.fornecedoresSelecionados = new ArrayList<String>();
	}

	@UiHandler("btAdicionar")
	void adicionarBox(ClickEvent e) {
		final ConfiguracaoBoxWrapper box = new ConfiguracaoBoxWrapper();
		final List<EstabelecimentoWrapper> estabelecimentos = new ArrayList<EstabelecimentoWrapper>();
		EstabelecimentoWrapper estabelecimento;
		box.setNomeBox(this.tbNomeBox.getText());
		
		for(String chave:this.fornecedoresSelecionados){
			estabelecimento = new EstabelecimentoWrapper();
			estabelecimento.setChave(chave);
			estabelecimentos.add(estabelecimento);
		}
		box.setEstabelecimentos(estabelecimentos);
		
		this.servidor.inserirConfiguracoesBox(box, this.callbackInserirBox);
	}

	@UiHandler("btAdicionarEstabelecimento")
	void adicionarEstabelecimento(ClickEvent e) {
		final int selecionado = this.listaEstabelecimentos.getSelectedIndex();
		final int linha = this.tabelaEstabelecimentosSelecionados.getRowCount();
		final String estabelecimento = this.listaEstabelecimentos.getItemText(selecionado);
		final String chave = this.listaEstabelecimentos.getValue(selecionado);
		
		this.fornecedoresSelecionados.add(chave);
		this.tabelaEstabelecimentosSelecionados.setText(linha, 0, estabelecimento);
	}
}
